#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//重要结论: 当数组名做函数参数时, 实际传递给函数的是一个指向数组第一个元素的指针
//数组做函数参数时, 形参类型应该定义为数组第一个元素的指针类型
//数组指针意思是指向整个数组的指针
//二维数组做函数参数 会退化为一维数组指针
void printfBiArray(int (*parr)[3], int len1, int len2)
{
    for (int i = 0; i < len1; ++i)
    {
        for (int j = 0; j < len2; ++j)
        {
            printf("%d ", *(*(parr+i)+j));       
        }
    }

    printf("\n");
}

void test01()
{
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    //二维可以在一行定义吗?可以 因为内存空间没有二纬空间是线性空间
    //int arr[3][3] = {1,2,3,4,5,6,7,8,9};
    //也可以这样定义
    //int arr[][3] = {1,2,3,4,5,6,7,8,9};

    //对于二维数组同一维数组一样,除了sizeof  对数组名取地址之外，那么数组名就是指向数组首元素的指针
    //int (*pArray)[3] = arr;  //它们类型相等不报错,
                                                    //所以二位数组的数组名arr是一维整个数组地址
                                                    // 所以arr+1 会跳一个一维数组
                                                    // *(arr+2) 前面加个*解引用 变成 一位数组首元素地址
    
    printf("arr[1][2] = %d\n", arr[1][2]);
    printf("*(*(arr+2)+1) = %d\n", *(*(arr+2)+1));

    //二维数组做函数参数
    printfBiArray(arr, 3, 3);
}

int main(int argc, char const *argv[])
{
    test01();
    return 0;
}
